package in.lib.adapter;
import android.app.ActionBar;
import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentManager;
import android.content.Context;
import android.os.Bundle;
import android.os.Parcelable;
import android.support.v13.app.FragmentStatePagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.util.SparseArray;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.widget.FrameLayout.LayoutParams;
import android.widget.LinearLayout;
import android.widget.TextView;
import java.util.ArrayList;
import in.lib.Constants;
import in.lib.utils.Views;
import in.rob.client.R;
import in.rob.client.fragment.base.StreamFragment;
import lombok.Getter;
public class ViewPageAdapter extends FragmentStatePagerAdapter implements OnPageChangeListener
{
@Getter private Context context;
@Getter private FragmentManager manager;
private SparseArray<Fragment> fragments;
private ArrayList<Class<? extends Fragment>> fragmentClasses;
private ArrayList<Bundle> bundles;
private ViewPager viewPager;
private LinearLayout indicatorContainer;
private View indicator;
private TextView title;
private int index = 0;
public ViewPageAdapter(Activity context, FragmentManager manager, ViewPager pager)
{
super(manager);
this.context = context;
this.manager = manager;
this.viewPager = pager;
this.bundles = new ArrayList<Bundle>(2);
this.fragmentClasses = new ArrayList<Class<? extends Fragment>>(2);
this.fragments = new SparseArray<Fragment>(3);
this.indicatorContainer = Views.findViewById(R.id.indicator, context);
this.setTopScrollable(context.getWindow());
if ((context.getActionBar().getDisplayOptions() & ActionBar.DISPLAY_SHOW_CUSTOM) == ActionBar.DISPLAY_SHOW_CUSTOM)
{
this.title = Views.findViewById(R.id.title, context.getActionBar().getCustomView());
}
if (pager != null)
{
pager.setOnPageChangeListener(this);
}
}
@Override public Parcelable saveState()
{
Bundle state = (Bundle)super.saveState();
state.putInt("index", index);
return state;
}
@Override public void restoreState(Parcelable state, ClassLoader loader)
{
super.restoreState(state, loader);
if (state != null)
{
Bundle bundle = (Bundle)state;
bundle.setClassLoader(loader);
Parcelable[] fss = bundle.getParcelableArray("states");
fragments.clear();
Iterable<String> keys = bundle.keySet();
for (String key : keys)
{
if (key.startsWith("f"))
{
int index = Integer.parseInt(key.substring(1));
Fragment f = manager.getFragment(bundle, key);
if (f != null)
{
f.setMenuVisibility(false);
fragments.put(index, f);
}
}
}
this.index = bundle.getInt("index");
onPageSelected(index);
}
}
public void addPage(Class<? extends Fragment> fragment, Bundle args)
{
this.fragmentClasses.add(fragment);
this.bundles.add(args);
this.indicatorContainer.post(new Runnable()
{
@Override public void run()
{
updateIndicator();
}
});
}
public void setTitle(Class<? extends Fragment> fragment, String title)
{
int index = fragmentClasses.indexOf(fragment);
if (index > -1)
{
Bundle args = bundles.get(index);
if (args != null)
{
args.putString(Constants.EXTRA_TITLE, title);
}
}
onPageSelected(this.index);
}
private void updateIndicator()
{
if (this.indicatorContainer != null)
{
this.indicatorContainer.removeAllViewsInLayout();
this.indicatorContainer.removeAllViews();
int count = this.fragmentClasses.size();
indicator = LayoutInflater.from(getContext()).inflate(R.layout.action_bar_tab, this.indicatorContainer, false);
indicator.setLayoutParams(new LayoutParams(this.indicatorContainer.getMeasuredWidth() / count, ViewGroup.LayoutParams.MATCH_PARENT));
this.indicatorContainer.addView(indicator);
this.indicatorContainer.scrollTo(0, 0);
if (count <= 1)
{
this.indicatorContainer.setVisibility(View.GONE);
}
else
{
this.indicatorContainer.setVisibility(View.VISIBLE);
}
}
}
@Override public Fragment getItem(int index)
{
Fragment fragment = Fragment.instantiate(getContext(), fragmentClasses.get(index).getName(), bundles.get(index));
return fragment;
}
@Override public Object instantiateItem(ViewGroup container, int position)
{
Fragment fragment = (Fragment)super.instantiateItem(container, position);
fragments.put(position, fragment);
return fragment;
}
@Override public void destroyItem(ViewGroup container, int position, Object object)
{
fragments.remove(position);
super.destroyItem(container, position, object);
}
/**
* Gets the fragment at the current position. This
* is <b>not</b> the same as {@link #getItem(int)} as
* it does not instantiate a new fragment on request.
*
* @param position The position to query
* @return The fragment if found, or null
*/
public Fragment getItemAt(int position)
{
return fragments.get(position);
}
public Fragment getCurrentFragment()
{
return fragments.get(viewPager.getCurrentItem());
}
@Override public void onPageScrolled(int index, float positionOffset, int positionOffsetPixels)
{
if (this.indicatorContainer != null && indicator != null)
{
this.indicatorContainer.scrollTo(-(int)(indicator.getMeasuredWidth() * (positionOffset + index)), 0);
}
}
@Override public void onPageSelected(int index)
{
this.index = index;
if (this.indicatorContainer != null && indicator != null)
{
this.indicatorContainer.scrollTo(-(indicator.getMeasuredWidth() * index), 0);
}
if (this.title != null)
{
this.title.setText(getPageTitle(index));
}
resetRefreshables();
setRefreshable(index);
}
@Override public void onPageScrollStateChanged(int state)
{
}
@Override public int getCount()
{
return fragmentClasses.size();
}
@Override public CharSequence getPageTitle(int position)
{
Bundle bundle = bundles.get(position);
if (bundle != null && bundle.containsKey(Constants.EXTRA_TITLE))
{
String title = bundle.getString(Constants.EXTRA_TITLE, "");
return title;
}
return "";
}
/**
* Hides all the refreshables for the non-visible fragments
*/
public void resetRefreshables()
{
for (int index = 0, size = getCount(); index < size; index++)
{
Fragment frag = getItemAt(index);
if (frag instanceof StreamFragment && ((StreamFragment)frag).getRefreshHelper() != null)
{
((StreamFragment)frag).getRefreshHelper().hideHelper();
}
}
}
/**
* Shows the indeterminate refreshable for the specific
* index
* @param index
*/
public void setRefreshable(int index)
{
Fragment frag = getItemAt(index);
if (frag instanceof StreamFragment && ((StreamFragment)frag).getRefreshHelper() != null)
{
if (((StreamFragment)frag).isLoading())
{
((StreamFragment)frag).getRefreshHelper().showHelper();
}
}
}
public void setTopScrollable(Window window)
{
if ((window.getDecorView().findViewById(R.id.title) != null))
{
window.getDecorView().findViewById(R.id.title).setOnClickListener(new View.OnClickListener()
{
@Override public void onClick(View v)
{
if (getCurrentFragment() instanceof StreamFragment)
{
((StreamFragment)getCurrentFragment()).scrollToTop();
}
}
});
}
}
}